Java抽象类(abstract)与三个修饰符(private, static, final)

您所在的位置:网站首页 private 类名 Java抽象类(abstract)与三个修饰符(private, static, final)

Java抽象类(abstract)与三个修饰符(private, static, final)

2023-11-11 02:14| 来源: 网络整理| 查看: 265

一、抽象类(abstract)

具备某种对象的特征,但不完整。

程序中的抽象类 像是一个模板,供其他类继承使用,但同时定义的一些抽象方法,子类必须实现 无法被实例化,只能被继承类里面的内容和普通类区别在于,它可以些抽象方法里面可以有抽象方法(也可以没有), 抽象方法的作用,是继承该抽象类的类,必须实现这些抽象方法,这就是抽象类的主要作用

抽象类头里必须带着abstract,就是说abstract class 类名

//Animal抽象类 public abstract class Animal { String breed; int age; //抽象方法 public abstract void eat(); public abstract void run(); } //继承Animal抽象类 public class Dog extends Animal{ @Override public void eat() { System.out.println("狗在吃"); } @Override public void run() { System.out.println("狗在跑"); } } //如果不吧抽象方法重写完,他会报错

普通类:你和我都是类吧

抽象类:嗯,但我不能被实例化,我的作用只是用来继承

普通方法:你说你定义的抽象方法必须被,我找普通方法也可以啊,重写一下方法谁不会啊。

抽象类:但你往往会忘记重写方法,而直接调用父类的方法了,你明明不是狮子却用了狮子类的方法,所以我必须这样规定好,不自己写等着报错吧

1.2 abstract修饰符修饰类里的各种元素 1.2.1修饰类名

这是抽象类必须有的,只有abstract修饰过的类名才叫抽象类,才能些抽象方法

public abstract class Animal { } 1.2.2 修饰构造方法

抽象类能修饰构造方法吗?

答案是不能

public abstract class Animal { abstract Animal(){ //报错 System.out.println("我是动物"); } } //报错抽象类不能修饰构造方法 1.2.3 修饰成员属性与方法

属性 抽象类能修饰属性吗? 不能,很显然修饰属性没有意义。

方法 抽象类主要作用就是抽象方法,抽象方法不能写函数体(不能有内容),继承抽象类的子类必须重写抽象方法

public abstract class Animal { //这就是没有方法体 public abstract void eat(); public abstract void run(); } 1.2.4构造块(了解)

abstract不能修饰构造块

总结:(除了开头需要定义为抽象类)abstract只能修饰方法

二、static(静态)

static修饰的属性与方法,代表为静态的,是属于类的,而不是属于对象的,在类写完时候就加载完了

静态就是无需实例化即可以使用的,动态是实例化之后才能使用的。

public class Utile { static String name = "静态类"; static void method(){ System.out.println("我是静态方法"); } } public class TestUtile { public static void main(String[] args) { //调用属性 System.out.println(Utile.name); //调用方法 Utile.method(); } } 结果: 静态类 我是静态方法

可以看到无需实例化,即可直接调用

调用静态方法 类名.方法名()调用静态属性 类名.属性 2.2静态属性与方法

属性 上面说静态属性和方法是属于类的,刚刚就证明了,无需实例化即可使用,但如果我实例化后对他们进行修改呢?

实例化后把上面的静态属性改了

public class TestUtile { public static void main(String[] args) { //实例化类后修改属性 Utile utile = new Utile(); utile.name = "hello world"; //实例化多个Utile类 Utile utile1 = new Utile(); System.out.println(utile1.name); Utile utile2 = new Utile(); System.out.println(utile2.name); } } 结果: hello world hello world

可以看到静态改了,后面全部都改了

2.3继承的方法和属性

怎么才能使其方法修改呢?继承重写

但事实上,静态方法并没有继承这说法,来看看下面的吧

public class Utile { static String name = "静态类"; static void method(){ System.out.println("我是静态方法"); } } //继承了上面的 public class ChangeUtile extends Utile{ static String name = "继承后的类"; static void method(){ System.out.println("修改后的方法"); } } public class TestUtile { public static void main(String[] args) { Utile.method(); ChangeUtile.method(); System.out.println("---------------------"); System.out.println("Utile.name:"+Utile.name); System.out.println("ChangeUtile.name:"+ChangeUtile.name); } } 结果: 我是静态方法 修改后的方法 --------------------- Utile.name:静态类 ChangeUtile.name:继承后的类

可以看到,静态方法和属性没有重写,不会重叠了不会影响父类

但是,如果不取重写

public class demo2 { public static void main(String[] args) { Cat cat = new Cat(); cat.say = "我是猫"; System.out.println(Animal.say); } } class Animal{ static String say = "hello,我是动物"; } class Cat extends Animal{} 结果: 我是猫

也就是说,子类继承了父类的static值,子类继承的static改变了,父类的也改变了!!!

2.3静态方法里的结构

刚刚上面说了静态方法没有重写这一概念

下面说下静态方法里面的构造

静态方法里不能有未确定的元素

什么样的元素叫不确定元素呢?

因为静态属性和方法是在类存在时候就加载完了,但普通的成员属性和方法是实例化后才加载进去的,所以我们不能吧一个未加载的元素放到静态方法中(重点)

public class Demo02 { public static void main(String[] args) { go(); } private static void go() { System.out.println("gogogo"); } }

我们经常写的主函数,就是一个一个静态方法,如果我想调用本类里面的一个方法,就要是写成静态方法,同理,我们在静态方法里调用外面的属性,也该是静态属性

三、final(常量)

被final修饰的属性一定要被赋值且不能修改

什么样的数是常量呢? 例如pi = 3.14159…

public class Demo02 { public static void main(String[] args) { double pi = Math.PI; } }

在这里插入图片描述 可以看到PI就是常量,我们不能改变PI的大小,这是宇宙的公理(这里也用带了静态属性哦)

总结(非常重要) 1、private 高级复习 构造方法:private修饰的构造方法,实例化将不能调用,且报错,private修饰的无参构造的类,不能被继承且报错

其意义在于不能被实例化,常用于所有元素都为static静态的类中,由类本身去调用元素

方法与属性:1、private修饰的方法,实例化也是不能直接调用的,需要在类内部使用,如this.方法,2、属性不能在实例化后赋值,所以由set\get方法来给予赋值,函数也是通过第三方函数来调用,可重载。

继承:private修饰的属性与方法等都不能被继承

类:不允许修饰类 private class Test{} 报错!

private修饰的构造方法的类,如Math类,不能被继承,里面全是静态方法。

2、static

static为静态,被他修饰的属性与方法不需要实例化即可调用,如类名.属性,类名.方法

构造方法:static不允许修饰构造方法

构造块:静态构造块是仅次于静态代码块执行, 在类生成时,会先执行静态属性,再执行静态代码块

方法与属性:1、static修饰的方法和属性都是属于类本身的,也就不需要实例化即可调用,在static修饰值改变后,所有实例化后的属性值都改变

​ 2、static修饰的方法里不能用普通成员属性!static修饰的方法,在类加载的时候是被首 先加载的,实例化后才加载非static内容,所以加载static时 是不能有非static内容的

​ 3、可重载

继承:子类继承了父类的static值,子类继承的static改变了,父类的也改变了!!! static修饰的属性和方法不能重写。

类:类用不了static修饰

调用静态方法尽量不要用引用对象(不用实例化对象的名字调用)如用Math.max()(Math类是不能实例化的)

3、final

构造方法:final不能修饰构造方法

构造块:不能修饰构造块

方法与属性:1、final修饰的属性必须在定义时候赋值,不能final int a; 不能实例化后才赋值,是最终 的唯一,是常量

​ 2、final修饰的方法可以调用但继承不能被修改。

​ 3、可被重载

继承:可被继承,但继承的方法和属性都不可被重写,被final修饰的类不能被继承

类:被final修饰的类不能被继承

被final修饰的属性和方法都为不可覆盖(如继承后不能重写)

静态公开唯一的属性为常量,一般应该都是全大写

public static final double PI = 3.14159265…;

问:为何需要将类标记为final ? 这不会破坏面向对象的目的吗? 答:会也不会。将类标记为final主要目的是为了安全。例如String这个类,假使有人继承过,弄一个行为很不一致的版本,就会对于其操作String的程序产生很多问题。

问:如果类已经是final的,再标记final方法是不是很多余? 答:不只是多余,而且多了很多。如果一个类不能被子类化,则它根本就无法被覆盖。如果只是想限制部分的方法不能被覆盖过,那就单独地标记它们的final的就行了。

4、abstract

抽象类是一个模板,供其他类使用

构造方法:不能修饰构造方法构造块:不能修饰构造块属性:不能修饰属性方法:修饰的方法不能写代码,为模板作用,只能被子类继承重写继承:1、可以被abstract类继承,继承过去的抽象方法可以选择性重写 2、被普通类继承时,必须重写抽象方法 3、抽象类本身不能实例化类:可被修饰类,但不能被实例化,只能被继承,为模板作用 继承的类需要重写他的抽象方法


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3